home *** CD-ROM | disk | FTP | other *** search
/ 3D Games - Real-time Rend…ng & Software Technology / 3D Games - Real-time Rendering & Software Technology.iso / flysdk / plugin / weapon / missile.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  2000-11-20  |  3.8 KB  |  213 lines

  1. #include "..\..\lib\Fly3D.h"
  2. #include "weapon.h"
  3.  
  4. int missile::step(int dt)
  5. {
  6.     if (node==0)
  7.     {
  8.         life=-1;
  9.         if (snd)
  10.             delete snd;
  11.         return 0;
  12.     }
  13.  
  14.     if(lookrange&&missile_find)
  15.     {
  16.         enemy=0;
  17.         enemydist=lookrange;
  18.         flyengine->apply_bsp(flyengine->bsp,pos,lookrange,this,missile_find);
  19.         if (enemy)
  20.             {
  21.             vector v=(enemy)->pos-pos;
  22.             v.normalize();
  23.             rotate(Z,v,rotvel*dt);
  24.             vel=Z*vel.length();
  25.             }
  26.     }
  27.  
  28.     flyengine->hitobj=0;
  29.     if (player>=0)
  30.         flyengine->excludecollision=(bsp_object *)directx->players[player].data;
  31.     particle::step(dt);
  32.     flyengine->excludecollision=0;
  33.  
  34.     if (flyengine->hitobj || life<=0)
  35.         {
  36.         life=-1;
  37.         if (flyengine->hitobj==0)
  38.             if (exp)
  39.                 exp->do_explode(pos,Z,player);
  40.             else ;
  41.         else
  42.             {
  43.             pos=flyengine->hitip+flyengine->hitmesh->faces[flyengine->hitface]->normal;
  44.             if (hm && flyengine->hitmesh->localfaces==0)
  45.                 {
  46.                 hitmark *tmp=(hitmark *)hm->clone();
  47.                 tmp->pos=pos;
  48.                 tmp->mode=0;
  49.                 tmp->align_z(flyengine->hitmesh->faces[flyengine->hitface]->normal);
  50.                 flyengine->activate(tmp);
  51.                 }
  52.             if (exp)
  53.                 exp->do_explode(pos,flyengine->hitmesh->faces[flyengine->hitface]->normal,player);
  54.             }
  55.         if (player==0 && viewport && viewport->target==this)
  56.             {
  57.             viewport->target=0;
  58.             viewport->on=0;
  59.             }
  60.         }
  61.     
  62.     if (l)
  63.         {
  64.         l->pos=pos-Z*lightzpos;
  65.         l->step(dt);
  66.         }
  67.     
  68.     if (snd)
  69.     {
  70.         if (life==-1)
  71.             delete snd;
  72.         else
  73.             snd->step(dt);
  74.     }
  75.  
  76.     force.x=force.y=force.z=0;
  77.  
  78.     return 1;
  79. }
  80.  
  81. void missile::draw()
  82. {
  83.     if (node==0 || flyengine->cam==this) return;
  84.     
  85.     if (objmesh)
  86.     {
  87.         if (node)
  88.             {
  89.             objmesh->color=node->color+dynlight;
  90.             dynlight.null();
  91.             }
  92.         glPushMatrix();
  93.         glTranslatef(pos.x,pos.y,pos.z);
  94.         glMultMatrixf((float *)&mat);
  95.         objmesh->draw();
  96.         glPopMatrix();
  97.     }
  98.  
  99.     if (l)
  100.         {
  101.         l->pos=pos-Z*lightzpos;
  102.         l->draw();
  103.         }    
  104. }
  105.  
  106. bsp_object *missile::clone()
  107. {
  108.     missile *tmp=new missile;
  109.     *tmp=*this;
  110.     tmp->source=this;
  111.     return tmp;
  112. }
  113.  
  114. int missile::get_custom_param_desc(int i,param_desc *pd)
  115. {
  116.     if (pd!=0)
  117.     switch(i)
  118.     {
  119.         case 0:
  120.             pd->type='f';
  121.             pd->data=&rotvel;
  122.             strcpy(pd->name,"rotvel");
  123.             break;
  124.         case 1:
  125.             pd->type='f';
  126.             pd->data=&lookrange;
  127.             strcpy(pd->name,"lookrange");
  128.             break;
  129.         case 2:
  130.             pd->type='a';
  131.             pd->data=&lookangle;
  132.             strcpy(pd->name,"lookangle");
  133.             break;
  134.         case 3:
  135.             pd->type=TYPE_EXPLODE;
  136.             pd->data=&exp;
  137.             strcpy(pd->name,"explode");
  138.             break;
  139.         case 4:
  140.             pd->type=TYPE_LIGHT;
  141.             pd->data=&l;
  142.             strcpy(pd->name,"light");
  143.             break;
  144.         case 5:
  145.             pd->type='f';
  146.             pd->data=&lightzpos;
  147.             strcpy(pd->name,"lightzpos");
  148.             break;
  149.         case 6:
  150.             pd->type=TYPE_SOUND;
  151.             pd->data=&snd;
  152.             strcpy(pd->name,"sound");
  153.             break;
  154.         case 7:
  155.             pd->type=TYPE_VIEWPORT;
  156.             pd->data=&viewport;
  157.             strcpy(pd->name,"viewport");
  158.             break;
  159.         case 8:
  160.             pd->type='3';
  161.             pd->data=&objmesh;
  162.             strcpy(pd->name,"mesh");
  163.             break;
  164.         case 9:
  165.             pd->type=TYPE_HITMARK;
  166.             pd->data=&hm;
  167.             strcpy(pd->name,"hitmark");
  168.             break;
  169.         case 10:
  170.             pd->type='f';
  171.             pd->data=&damage;
  172.             strcpy(pd->name,"damage");
  173.             break;
  174.     }
  175.     return 11;
  176. }
  177.  
  178. void missile::fire(vector& p,vector& dir,float v,int playerid)
  179. {
  180.     missile *m=(missile *)clone();
  181.     m->pos=p;
  182.     m->vel=dir*v;
  183.     m->align_z(dir);
  184.     m->player=playerid;
  185.     if (m->snd && flyengine->mute==0)
  186.         {
  187.         m->snd=(dyn_sound *)m->snd->clone();
  188.         m->snd->life=life;
  189.         m->snd->lockpos=&m->pos;
  190.         m->snd->lockvel=&m->vel;
  191.         m->snd->step(0);
  192.         }
  193.     else m->snd=0;
  194.     if (viewport && playerid==0)
  195.     {
  196.         viewport->target=m;
  197.         viewport->on=1;
  198.     }
  199.     flyengine->activate(m);
  200. }
  201.  
  202. int missile::message(vector& p,float rad,int msg,int param,void *data)
  203. {
  204.     if (msg==FLYOBJM_ILLUM)
  205.     {
  206.         float fac=(p-pos).length()/rad;
  207.         if (fac<1.0f)
  208.             dynlight+=*((vector *)data)*(1.0f-fac);
  209.     }
  210.  
  211.     return 0;
  212. }
  213.